package com.changgou.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.goods.dao.*;
import com.changgou.goods.pojo.*;
import com.changgou.goods.service.SpuService;
import com.changgou.utils.IdWorker;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class SpuServiceImpl implements SpuService {

    @Autowired
    private SpuMapper spuMapper;

    @Autowired
    private SkuMapper skuMapper;  //sku Mapper

    @Autowired
    private IdWorker idWorker; //Id生成器

    @Autowired
    private CategoryMapper categoryMapper; //分类 Mapper

    @Autowired
    private BrandMapper brandMapper; //品牌 Mapper

    @Autowired
    private CategoryBrandMapper categoryBrandMapper;  //分类与品牌中间表 Mapper


    /**
     * 查询全部列表
     * @return
     */
    @Override
    public List<Spu> findAll() {
        return spuMapper.selectAll();
    }

    /**
     * 根据ID查询
     * @param id
     * @return
     */
    @Override
    public Spu findById(String id){
        return  spuMapper.selectByPrimaryKey(id);
    }


    /**
     * 增加商品
     * @param goods
     */
    @Override
    @Transactional //事务管理
    public void add(Goods goods){


        //添加Spu
        Spu spu = goods.getSpu();

        //设置Spu ID(使用分布式 ID生成器)
        long l = idWorker.nextId(); //生成ID
        spu.setId(String.valueOf(l));
        //是否上架
        spu.setIsMarketable("0"); //否
        //设置删除状态
        spu.setIsDelete("0"); //否
        //设置审核状态
        spu.setStatus("0"); //否
        //将Spu添加到 库中
        spuMapper.insertSelective(spu);

        //添加Sku 列表
        saveSkuLis(goods);


    }

    /**
     * 保存Sku 列表 并设置 品牌与分类的关联
     */
    public void saveSkuLis(Goods goods){

        //获取 goods中 Spu
        Spu spu = goods.getSpu();
        //获取 Sku 并设置 一些参数(前端未传来的参数)
        List<Sku> skuList = goods.getSkuList();
        for (Sku sku : skuList) {
            //设置sku的 ID(分布式 ID生成器)
            sku.setId(String.valueOf(idWorker.nextId()));

            //设置sku规格
            if (sku.getSpec() == null || "".equals(sku.getSpec())) {
                sku.setSpec("{}");
            }

            //设置sku 的名字 : spu(单个商品总称 + 上该商品具体规格 : 如 华为P30 红色 8G+320G)
            String name = spu.getName();  //Spu单个商品总称 : 如 华为p30
            String spec = sku.getSpec(); //sku商品规格 如  {"颜色":"红","机身内存":"64G"}
            Map map = JSON.parseObject(spec, Map.class);// 将该 JSON格式的规格转成 Map
            String SkuName = name; //设置一个变量 , 接收 Spu名字与Sku 拼接后的名称
            if(map!=null&&map.size()>0) {  //判断 规格是否为空
                Collection values = map.values(); //获取 规格中的 值 :  如  红 , 64G
                for (Object value : values) {
                    SkuName += " " + value;
                }
            }
            sku.setName(SkuName); //将拼接后的名字 注入 Sku中

            //设置创建时间
            Date date = new Date(); //当前时间
            sku.setCreateTime(date);
            //设置修改时间
            sku.setUpdateTime(date);
            //设置Spu的 ID
            String id = spu.getId(); //获取Spu id
            sku.setSpuId(id);
            //设置所属类 ID
            Integer category3Id = spu.getCategory3Id(); //获取 所属类(三级)ID(商品都属于三级分类 如 : 衣服(一级分类) -> 上衣(二级分类) ->西装(三级分类) )
            Category category = categoryMapper.selectByPrimaryKey(category3Id);//根据分类类ID 获取 分类 对象
            sku.setCategoryId(category.getId());
            //设置所属类 名
            sku.setCategoryName(category.getName());
            //设置品牌名称
            Integer brandId = spu.getBrandId(); //从Spu中获取品牌ID
            Brand brand = brandMapper.selectByPrimaryKey(brandId);  //根据品牌ID查询 获取对应品牌对象
            sku.setBrandName(brand.getName());

            //都设置完毕 最后 将Sku 添加到 库中
            skuMapper.insertSelective(sku);

            //设置品牌与分类的关联
            CategoryBrand categoryBrand = new CategoryBrand();
            categoryBrand.setBrandId(brandId); //设置品牌ID
            categoryBrand.setCategoryId(category3Id); //设置分类ID
            int count = categoryBrandMapper.selectCount(categoryBrand);//判断该品牌与分类 是否已有关联
            if(count == 0){
                categoryBrandMapper.insertSelective(categoryBrand);  //没有该 关联 ,添加关联
            }


        }

    }


    /**
     * 修改
     * @param goods
     */
    @Override
    public void update(Goods goods){

        Spu spu = goods.getSpu();//获取 spu
        spuMapper.updateByPrimaryKeySelective(spu);  //修改 spu
        //修改Sku 删除 原来的 sku
        Example example = new Example(Sku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",spu.getId());
        skuMapper.deleteByExample(example);
        //, 设置成最新的SKU
        saveSkuLis(goods);

    }

    /**
     * 软删除
     * @param id
     */
    @Override
    public void delete(String id){
        //根据ID查询 Spu
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }
        //判断商品为 下架状态
        if(spu.getIsMarketable().equals("1")){
            throw new RuntimeException("当前商品为上架状态");
        }

        //修改商品删除状态(软删除)
        spu.setIsDelete("1");
        spuMapper.updateByPrimaryKeySelective(spu);

    }


    /**
     * 条件查询
     * @param searchMap
     * @return
     */
    @Override
    public List<Spu> findList(Map<String, Object> searchMap){
        Example example = createExample(searchMap);
        return spuMapper.selectByExample(example);
    }

    /**
     * 分页查询
     * @param page
     * @param size
     * @return
     */
    @Override
    public Page<Spu> findPage(int page, int size){
        PageHelper.startPage(page,size);
        return (Page<Spu>)spuMapper.selectAll();
    }

    /**
     * 条件+分页查询
     * @param searchMap 查询条件
     * @param page 页码
     * @param size 页大小
     * @return 分页结果
     */
    @Override
    public Page<Spu> findPage(Map<String,Object> searchMap, int page, int size){
        PageHelper.startPage(page,size);
        Example example = createExample(searchMap);
        return (Page<Spu>)spuMapper.selectByExample(example);
    }

    /**
     * 构建查询对象
     * @param searchMap
     * @return
     */
    private Example createExample(Map<String, Object> searchMap){
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        if(searchMap!=null){
            // 主键
            if(searchMap.get("id")!=null && !"".equals(searchMap.get("id"))){
                criteria.andEqualTo("id",searchMap.get("id"));
           	}
            // 货号
            if(searchMap.get("sn")!=null && !"".equals(searchMap.get("sn"))){
                criteria.andEqualTo("sn",searchMap.get("sn"));
           	}
            // SPU名
            if(searchMap.get("name")!=null && !"".equals(searchMap.get("name"))){
                criteria.andLike("name","%"+searchMap.get("name")+"%");
           	}
            // 副标题
            if(searchMap.get("caption")!=null && !"".equals(searchMap.get("caption"))){
                criteria.andLike("caption","%"+searchMap.get("caption")+"%");
           	}
            // 图片
            if(searchMap.get("image")!=null && !"".equals(searchMap.get("image"))){
                criteria.andLike("image","%"+searchMap.get("image")+"%");
           	}
            // 图片列表
            if(searchMap.get("images")!=null && !"".equals(searchMap.get("images"))){
                criteria.andLike("images","%"+searchMap.get("images")+"%");
           	}
            // 售后服务
            if(searchMap.get("saleService")!=null && !"".equals(searchMap.get("saleService"))){
                criteria.andLike("saleService","%"+searchMap.get("saleService")+"%");
           	}
            // 介绍
            if(searchMap.get("introduction")!=null && !"".equals(searchMap.get("introduction"))){
                criteria.andLike("introduction","%"+searchMap.get("introduction")+"%");
           	}
            // 规格列表
            if(searchMap.get("specItems")!=null && !"".equals(searchMap.get("specItems"))){
                criteria.andLike("specItems","%"+searchMap.get("specItems")+"%");
           	}
            // 参数列表
            if(searchMap.get("paraItems")!=null && !"".equals(searchMap.get("paraItems"))){
                criteria.andLike("paraItems","%"+searchMap.get("paraItems")+"%");
           	}
            // 是否上架
            if(searchMap.get("isMarketable")!=null && !"".equals(searchMap.get("isMarketable"))){
                criteria.andEqualTo("isMarketable",searchMap.get("isMarketable"));
           	}
            // 是否启用规格
            if(searchMap.get("isEnableSpec")!=null && !"".equals(searchMap.get("isEnableSpec"))){
                criteria.andEqualTo("isEnableSpec", searchMap.get("isEnableSpec"));
           	}
            // 是否删除
            if(searchMap.get("isDelete")!=null && !"".equals(searchMap.get("isDelete"))){
                criteria.andEqualTo("isDelete",searchMap.get("isDelete"));
           	}
            // 审核状态
            if(searchMap.get("status")!=null && !"".equals(searchMap.get("status"))){
                criteria.andEqualTo("status",searchMap.get("status"));
           	}

            // 品牌ID
            if(searchMap.get("brandId")!=null ){
                criteria.andEqualTo("brandId",searchMap.get("brandId"));
            }
            // 一级分类
            if(searchMap.get("category1Id")!=null ){
                criteria.andEqualTo("category1Id",searchMap.get("category1Id"));
            }
            // 二级分类
            if(searchMap.get("category2Id")!=null ){
                criteria.andEqualTo("category2Id",searchMap.get("category2Id"));
            }
            // 三级分类
            if(searchMap.get("category3Id")!=null ){
                criteria.andEqualTo("category3Id",searchMap.get("category3Id"));
            }
            // 模板ID
            if(searchMap.get("templateId")!=null ){
                criteria.andEqualTo("templateId",searchMap.get("templateId"));
            }
            // 运费模板id
            if(searchMap.get("freightId")!=null ){
                criteria.andEqualTo("freightId",searchMap.get("freightId"));
            }
            // 销量
            if(searchMap.get("saleNum")!=null ){
                criteria.andEqualTo("saleNum",searchMap.get("saleNum"));
            }
            // 评论数
            if(searchMap.get("commentNum")!=null ){
                criteria.andEqualTo("commentNum",searchMap.get("commentNum"));
            }

        }
        return example;
    }


    /**
     * 根据ID查询 商品
     */
    public Goods findGoodsById(String id){

        //查询 Spu
        Spu spu = spuMapper.selectByPrimaryKey(id);

        //根据 Sku列表
        Example example = new Example(Sku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",id);
        List<Sku> skus = skuMapper.selectByExample(example);

        //封装 ,返回
        Goods goods = new Goods();
        goods.setSpu(spu);
        goods.setSkuList(skus);
        return goods;

    }

    /**
     * 根据ID审核商品
     * @param id
     */
    @Override
    public void audit(String id) {
        //根据ID查询 Spu
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }
        //判断 该Spu是否 处于删除状态
        String isDelete = spu.getIsDelete();
        if(isDelete.equals("1")){
            throw new RuntimeException("当前商品为删除状态");
        }

        //不处于删除状态,修改审核状态为1,上下架状态为1
        spu.setStatus("1"); //设置 审核状态 为1 : 以审核
        spu.setIsMarketable("1"); // 设置上架状态 : 已上架
        //将新的封装后的 spu入库
        spuMapper.updateByPrimaryKeySelective(spu);

    }

    /**
     * 根据ID 下架商品
     * @param id
     */
    @Override
    public void pull(String id) {

        //根据ID查询商品 判断商品是否存在
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }
        //判断商品是否为删除状态
        if(spu.getIsDelete().equals("1")){
            throw new RuntimeException("当前商品为以删除状态");
        }
        //设置商品为下架状态
        spu.setIsMarketable("0");
        spuMapper.updateByPrimaryKeySelective(spu);

    }

    /**
     * 根据ID 上架商品
     * @param id
     */

    @Override
    public void put(String id) {
        //根据ID查询商品 判断商品是否存在
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }
        //判断商品的审核状态 ,
        if(spu.getStatus().equals("0")){
            throw new RuntimeException("当前商品未审核");
        }

        spu.setIsMarketable("1");
        spuMapper.updateByPrimaryKeySelective(spu);
    }

    /**
     * 根据商品ID 还原删除的商品
     * @param id
     */
    @Override
    public void restore(String id) {
        //根据ID查询商品 判断商品是否存在
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }

        //判断该商品是否为 上架状态
        if(spu.getIsMarketable().equals("1")){
            throw new RuntimeException("当前商品为上架状态");
        }

        //判断该商品是否为 以删除状态
        if(spu.getIsDelete().equals("0")){
            throw new RuntimeException("当前商品为未删除状态");
        }
        //修改删除状态,并修改审核状态为 未审核
        spu.setIsDelete("0");  //未删除
        spu.setStatus("0");     //未审核
        spuMapper.updateByPrimaryKeySelective(spu);
    }


    /**
     * 根据ID硬删除商品(硬删除 : 从数据库中直接删除掉该条数据)
     */

    @Override
    public void realDel(String id) {

        //根据ID查询商品 判断商品是否存在
        Spu spu = spuMapper.selectByPrimaryKey(id);
        if(spu==null){
            throw new RuntimeException("当前商品不存在");
        }
        //判断该商品是否为 已删除状态
        if(spu.getIsDelete().equals("0")){
            throw new RuntimeException("当前商品为未删除状态");
        }

        //硬删除 该条 商品数据
        spuMapper.deleteByPrimaryKey(id);

    }






}
